package com.zlzlib.common.util;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * @DateTime: 2022/12/27 16:18
 * @Author zlz
 * @Version 1.0
 */
public class MyDateUtils {

    public static SimpleDateFormat getSimpleDateFormat(String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        format.setTimeZone(TimeZone.getTimeZone(ZoneId.SHORT_IDS.get("CTT")));
        return format;
    }

    /**
     * 将 yyyy-MM-dd HH:mm:ss 格式的string转化为日期
     *
     * @param string 日期
     * @return 返回日期格式
     */
    public static Date getDateFromStringYs(String string) {
        if (string == null) {
            return null;
        }
        try {
            return getSimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(string);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param date 日期
     * @return 返回日期字符
     */
    public static String getDateStringYs(Date date) {
        return getSimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    }


    /**
     * 得到几天之前的时间
     *
     * @param num 几天
     * @return 时间
     */
    public static Date getDateBeforeDayNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, -num);
        return c.getTime();
    }

    /**
     * 得到几小时之前的时间
     *
     * @param num 几小时
     * @return 时间
     */
    public static Date getDateBeforeHourNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.HOUR_OF_DAY, -num);
        return c.getTime();
    }

    /**
     * 得到几分钟之前的时间
     *
     * @param num 几分钟
     * @return 时间
     */
    public static Date getDateBeforeMinuteNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MINUTE, -num);
        return c.getTime();
    }

    /**
     * 得到几天之后的时间
     *
     * @param num 几天
     * @return 时间
     */
    public static Date getDateAfterDayNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, num);
        return c.getTime();
    }

    /**
     * 得到几小时之后的时间
     *
     * @param num 几小时
     * @return 时间
     */
    public static Date getDateAfterHourNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.HOUR_OF_DAY, num);
        return c.getTime();
    }

    /**
     * 得到几分钟之后的时间
     *
     * @param num 几分钟
     * @return 时间
     */
    public static Date getDateAfterMinuteNum(Integer num) {
        if (num == null) {
            num = 0;
        }
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MINUTE, num);
        return c.getTime();
    }

    /**
     * 获得某天的起始时间
     *
     * @param num 0=今天 往前为负数 往后为正数
     * @return 时间
     */
    public static Date getDayStart(Integer num) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, num);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * 获得某天的结束时间
     *
     * @param num 0=今天 往前为负数 往后为正数
     * @return 时间
     */
    public static Date getDayEnd(Integer num) {
        Calendar c = Calendar.getInstance();
        // 设置时间为今天开始的时间（0点0分0秒）
        c.add(Calendar.DAY_OF_MONTH, num);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        c.set(Calendar.MILLISECOND, 999);
        return c.getTime();
    }

    public static LocalDate dateToLocal(Date date) {
        return date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();
    }

    /**
     * 转化岁数
     *
     * @param birthDate 生日
     * @return 岁 月 天
     */
    public static String calculateAge(LocalDate birthDate) {
        LocalDate now = LocalDate.now();
        Period period = Period.between(birthDate, now);
        long days = ChronoUnit.DAYS.between(birthDate.plus(period), now);
        if (period.getYears() > 0) {
            return period.getYears() + "岁";
        } else if (period.getMonths() > 0) {
            return period.getMonths() + "月";
        } else if (days > 0) {
            return days + "天";
        } else {
            return "0天";
        }
    }
}
